Balken FEM mit Python#

In diesem Notebook wird die Lösung eines Balkenproblems mit der Methode der finiten Elemente (FEM) in Python implementiert. Die Lösung wird mit der analytischen Lösung verglichen und die Konvergenz der FEM-Lösung wird untersucht.

Balken_TM21.png

Die Differentialgleichung für die Durchbiegung \(w\) eines Balkens mit konstanter Biegesteifigkeit \(EI\) lautet:

\[ EI w^{IV} = q_0 \]

Die schwache Form der Differentialgleichung wurde in der Vorlesung besprochen und lautet:

\[ EI_y \int_L \delta w'' w'' \text{ dx} - \int_L q(x) \delta w \text{ dx} - F_I \delta w_I - M_J \delta w'_J = 0 \; . \]

Hierbei stellen \(F_I\) und \(M_I\) die an den Knoten angreifenden Einzellasten und Momente dar.

Das Balkenelement hat folgende interne Freiheitsgrade und angreifende Lasten:

Balkenelement.png

Verschiebungsansatz#

Analog zum Stabelement führen wir die normierte Koordinate \(\xi=\frac{x}{\ell_e}\) ein. Die Ansatzfunktionen für die Durchbiegung \(w_h\) wird dann als Linearkombination der Formfunktionen \(N_I\) und der Freiheitsgrade \(\hat{w}_I\) geschrieben: $\( w_h = \sum_{I=1}^{6} N_I \hat{w}_I \)$

Als Formfunktionen \(N_I\) werden die Hermite-Polynome verwendet. Diese lauten:

\[\begin{split} \begin{align} N_1 &= 1-3\xi^2+2\xi^3 \\ N_2 &= (\xi-2\xi^2+\xi^3)\ell_e \\ N_3 &= 3\xi^2-2\xi^3 \\ N_4 &= (-\xi^2+\xi^3)\ell_e \end{align} \end{split}\]
import numpy as np
import plotly.graph_objects as go

# Define the x values
x = np.linspace(0, 1, 100)

# Define the shape functions - Hermite polynomials 4th order
N1 = 1 - 3*x**2 + 2*x**3
N2 = x - 2*x**2 + x**3
N3 = 3*x**2 - 2*x**3
N4 = -x**2 + x**3

# Create the figure
fig = go.Figure()

# Add traces for each shape function
fig.add_trace(go.Scatter(x=x, y=N1, mode='lines', name='N_1'))
fig.add_trace(go.Scatter(x=x, y=N2, mode='lines', name='N_2'))
fig.add_trace(go.Scatter(x=x, y=N3, mode='lines', name='N_3'))
fig.add_trace(go.Scatter(x=x, y=N4, mode='lines', name='N_4'))
fig.update_layout(
    xaxis_title=r"$\xi$",
    yaxis_title=r'$N(\xi)$',
    legend=dict(x=1.05, y=1),
    font=dict(family="Serif", size=15),
    template='plotly_white',
    xaxis=dict(showgrid=True, gridcolor='grey', gridwidth=0.6, griddash='dash'),
    yaxis=dict(showgrid=True, gridcolor='grey', gridwidth=0.6, griddash='dash')
)

ElementSntsteifigkeitsmatrix für ein Balkenelem#

Die Formfunktionen sind bzgl. der lokalen Koordinate \(\xi\) definiert. In der schwachen Formulierung wird die Ableitung der Formfunktionen bzgl. der globalen Koordinate \(x\) benötigt. Die Ableitung der Formfunktionen bzgl. der globalen Koordinate \(x\) ist gegeben durch: $\( \frac{\text{d} \xi}{\text{d} x} = \frac{1}{\ell_e} \qquad \rightarrow \qquad \text{d} x= \ell_e \text{d} \xi \)$

Wenn wir uns nun den ersten Term der schwachen Form herausgreifen und die Ableitungen bilden lauten diese:

\[\begin{split} \begin{align*} EI_y \int_L \\ & = \end{align*} \end{split}\]